/**
 * LeetCode2：两数相加
 * 给出两个非空的链表用来表示两个非负的整数，它们各自的位数是按照逆序的方式存储，
 * 且每个节点只能保存一位数字
 * 将这两个数相加起来，返回一个新的链表用来表示它们的和
 */

/**
 * 定义链表节点
 */
function ListNode(val){
    this.val = val;
    this.next = null;
}

/**
 *
 * @param {ListNode}l1
 * @param {ListNode}l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1,l2){
    const l3 = new ListNode(0);
    let p1 = l1;
    let p2 = l2;
    let p3 = l3;
    //用carry元素来表示两数相加后的进位值，如果carry不为0，说明需要往下一位上进位
    let carry = 0;
    while (p1 || p2){
        const v1 = p1 ? p1.val : 0;
        const v2 = p2 ? p2.val : 0;
        const val = v1 + v2 + carry;
        carry = Math.floor(val/10);
        p3.next = new ListNode(val % 10);
        if (p1.next) p1 = p1.next;
        if (p2.next) p2 = p2.next;
        p3 = p3.next;
    }
    //两个链表都循环完后，如果carry不为空，说明需要再进位
    if (carry) p3.next = new ListNode(carry);
    return l3.next;
};